home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / dungeon / sobjs.f < prev    next >
Encoding:
Text File  |  1987-09-16  |  13.0 KB  |  698 lines

  1. C SOBJS-    SIMPLE OBJECTS PROCESSOR
  2. C    OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
  3. C    MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
  4. C
  5. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  6. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  7. C WRITTEN BY R. M. SUPNIK
  8. C
  9. C DECLARATIONS
  10. C
  11.     LOGICAL FUNCTION SOBJS(RI,ARG)
  12.     IMPLICIT INTEGER (A-Z)
  13.     LOGICAL QOPEN
  14.     LOGICAL MOVETO,OPNCLS,LIT
  15.     LOGICAL QHERE,F
  16. #include "parser.h"
  17. #include "gamestate.h"
  18. #include "state.h"
  19. #include "rooms.h"
  20. #include "rflag.h"
  21. #include "rindex.h"
  22. #include "objects.h"
  23. #include "oflags.h"
  24. #include "oindex.h"
  25. #include "clock.h"
  26.  
  27. #include "villians.h"
  28. #include "advers.h"
  29. #include "verbs.h"
  30. #include "flags.h"
  31. C
  32. C FUNCTIONS AND DATA
  33. C
  34.     QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
  35. C SOBJS, PAGE 2
  36. C
  37.     IF(PRSO.GT.220) GO TO 5
  38.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  39. 5    IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  40.     AV=AVEHIC(WINNER)
  41.     SOBJS=.TRUE.
  42. C
  43.     GO TO (1000,3000,4000,6000,7000,8000,9000,
  44. &     13000,14000,16000,17000,
  45. &     21000,23000,24000,27000,28000,29000,30000,
  46. &     31000,33000,34000,36000,37000,38000,
  47. &     41000,42000,43000,44000,46000,
  48. &     53000,56000)
  49. &        RI
  50.     CALL BUG(6,RI)
  51. C
  52. C RETURN HERE TO DECLARE FALSE RESULT
  53. C
  54. 10    SOBJS=.FALSE.
  55.     RETURN
  56. C SOBJS, PAGE 3
  57. C
  58. C O1--    GUNK FUNCTION
  59. C
  60. 1000    IF(OCAN(GUNK).EQ.0) GO TO 10
  61. C                        !NOT INSIDE? F
  62.     CALL NEWSTA(GUNK,122,0,0,0)
  63. C                        !FALLS APART.
  64.     RETURN
  65. C
  66. C O2--    TROPHY CASE
  67. C
  68. 3000    IF(PRSA.NE.TAKEW) GO TO 10
  69. C                        !TAKE?
  70.     CALL RSPEAK(128)
  71. C                        !CANT.
  72.     RETURN
  73. C
  74. C O3--    BOTTLE FUNCTION
  75. C
  76. 4000    IF(PRSA.NE.THROWW) GO TO 4100
  77. C                        !THROW?
  78.     CALL NEWSTA(PRSO,129,0,0,0)
  79. C                        !BREAKS.
  80.     RETURN
  81. C
  82. 4100    IF(PRSA.NE.MUNGW) GO TO 10
  83. C                        !MUNG?
  84.     CALL NEWSTA(PRSO,131,0,0,0)
  85. C                        !BREAKS.
  86.     RETURN
  87. C SOBJS, PAGE 4
  88. C
  89. C O4--    ROPE FUNCTION
  90. C
  91. 6000    IF(HERE.EQ.DOME) GO TO 6100
  92. C                        !IN DOME?
  93.     DOMEF=.FALSE.
  94. C                        !NO,
  95.     IF(PRSA.NE.UNTIEW) GO TO 6050
  96. C                        !UNTIE?
  97.     CALL RSPEAK(134)
  98. C                        !CANT
  99.     RETURN
  100. C
  101. 6050    IF(PRSA.NE.TIEW) GO TO 10
  102. C                        !TIE?
  103.     CALL RSPEAK(135)
  104. C                        !CANT TIE
  105.     RETURN
  106. C
  107. 6100    IF((PRSA.NE.TIEW).OR.(PRSI.NE.RAILI)) GO TO 6200
  108.     IF(DOMEF) GO TO 6150
  109. C                        !ALREADY TIED?
  110.     DOMEF=.TRUE.
  111. C                        !NO, TIE IT.
  112.     OFLAG1(ROPE)=or(OFLAG1(ROPE),NDSCBT)
  113.     OFLAG2(ROPE)=or(OFLAG2(ROPE),CLMBBT)
  114.     CALL NEWSTA(ROPE,137,DOME,0,0)
  115.     RETURN
  116. C
  117. 6150    CALL RSPEAK(136)
  118. C                        !DUMMY.
  119.     RETURN
  120. C
  121. 6200    IF(PRSA.NE.UNTIEW) GO TO 6300
  122. C                        !UNTIE?
  123.     IF(DOMEF) GO TO 6250
  124. C                        !TIED?
  125.     CALL RSPEAK(134)
  126. C                        !NO, DUMMY.
  127.     RETURN
  128. C
  129. 6250    DOMEF=.FALSE.
  130. C                        !YES, UNTIE IT.
  131.     OFLAG1(ROPE)=and(OFLAG1(ROPE), not(NDSCBT))
  132.     OFLAG2(ROPE)=and(OFLAG2(ROPE), not(CLMBBT))
  133.     CALL RSPEAK(139)
  134.     RETURN
  135. C
  136. 6300    IF(DOMEF.OR.(PRSA.NE.DROPW)) GO TO 6400
  137. C                        !DROP & UNTIED?
  138.     CALL NEWSTA(ROPE,140,MTORC,0,0)
  139. C                        !YES, DROP.
  140.     RETURN
  141. C
  142. 6400    IF((PRSA.NE.TAKEW).OR. .NOT.DOMEF) GO TO 10
  143.     CALL RSPEAK(141)
  144. C                        !TAKE & TIED.
  145.     RETURN
  146. C
  147. C O5--    SWORD FUNCTION
  148. C
  149. 7000    IF((PRSA.EQ.TAKEW).AND.(WINNER.EQ.PLAYER))
  150. &        SWDACT=.TRUE.
  151.     GO TO 10
  152. C
  153. C O6--    LANTERN
  154. C
  155. 8000    IF(PRSA.NE.THROWW) GO TO 8100
  156. C                        !THROW?
  157.     CALL NEWSTA(LAMP,0,0,0,0)
  158. C                        !KILL LAMP,
  159.     CALL NEWSTA(BLAMP,142,HERE,0,0)
  160. C                        !REPLACE WITH BROKEN.
  161.     RETURN
  162. C
  163. 8100    IF(PRSA.EQ.TRNONW) CFLAG(CEVLNT)=.TRUE.
  164.     IF(PRSA.EQ.TRNOFW) CFLAG(CEVLNT)=.FALSE.
  165.     GO TO 10
  166. C
  167. C O7--    RUG FUNCTION
  168. C
  169. 9000    IF(PRSA.NE.RAISEW) GO TO 9100
  170. C                        !RAISE?
  171.     CALL RSPEAK(143)
  172. C                        !CANT
  173.     RETURN
  174. C
  175. 9100    IF(PRSA.NE.TAKEW) GO TO 9200
  176. C                        !TAKE?
  177.     CALL RSPEAK(144)
  178. C                        !CANT
  179.     RETURN
  180. C
  181. 9200    IF(PRSA.NE.MOVEW) GO TO 9300
  182. C                        !MOVE?
  183.     CALL RSPEAK(145+ORRUG)
  184.     ORRUG=1
  185.     OFLAG1(DOOR)=or(OFLAG1(DOOR),VISIBT)
  186.     RETURN
  187. C
  188. 9300    IF((PRSA.NE.LOOKUW).OR.(ORRUG.NE.0).OR.
  189. &        QOPEN(DOOR)) GO TO 10
  190.     CALL RSPEAK(345)
  191.     RETURN
  192. C SOBJS, PAGE 5
  193. C
  194. C O8--    SKELETON
  195. C
  196. 13000    I=ROBRM(HERE,100,LLD2,0,0)+ROBADV(WINNER,LLD2,0,0)
  197.     IF(I.NE.0) CALL RSPEAK(162)
  198. C                        !IF ROBBED, SAY SO.
  199.     RETURN
  200. C
  201. C O9--    MIRROR
  202. C
  203. 14000    IF(MIRRMF.OR.(PRSA.NE.RUBW)) GO TO 14500
  204.     MROOM=xor(HERE,1)
  205.     DO 14100 I=1,OLNT
  206. C                        !INTERCHANGE OBJS.
  207.       IF(OROOM(I).EQ.HERE) OROOM(I)=-1
  208.       IF(OROOM(I).EQ.MROOM) OROOM(I)=HERE
  209.       IF(OROOM(I).EQ.-1) OROOM(I)=MROOM
  210. 14100    CONTINUE
  211.     F=MOVETO(MROOM,WINNER)
  212.     CALL RSPEAK(163)
  213. C                        !SHAKE WORLD.
  214.     RETURN
  215. C
  216. 14500    IF((PRSA.NE.LOOKW).AND.(PRSA.NE.LOOKIW).AND.
  217. &        (PRSA.NE.EXAMIW)) GO TO 14600
  218.     I=164
  219. C                        !MIRROR OK.
  220.     IF(MIRRMF) I=165
  221. C                        !MIRROR DEAD.
  222.     CALL RSPEAK(I)
  223.     RETURN
  224. C
  225. 14600    IF(PRSA.NE.TAKEW) GO TO 14700
  226. C                        !TAKE?
  227.     CALL RSPEAK(166)
  228. C                        !JOKE.
  229.     RETURN
  230. C
  231. 14700    IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  232.     I=167
  233. C                        !MIRROR BREAKS.
  234.     IF(MIRRMF) I=168
  235. C                        !MIRROR ALREADY BROKEN.
  236.     MIRRMF=.TRUE.
  237.     BADLKF=.TRUE.
  238.     CALL RSPEAK(I)
  239.     RETURN
  240. C SOBJS, PAGE 6
  241. C
  242. C O10--    DUMBWAITER
  243. C
  244. 16000    IF(PRSA.NE.RAISEW) GO TO 16100
  245. C                        !RAISE?
  246.     IF(CAGETF) GO TO 16400
  247. C                        !ALREADY AT TOP?
  248.     CALL NEWSTA(TBASK,175,TSHAF,0,0)
  249. C                        !NO, RAISE BASKET.
  250.     CALL NEWSTA(FBASK,0,BSHAF,0,0)
  251.     CAGETF=.TRUE.
  252. C                        !AT TOP.
  253.     RETURN
  254. C
  255. 16100    IF(PRSA.NE.LOWERW) GO TO 16200
  256. C                        !LOWER?
  257.     IF(.NOT.CAGETF) GO TO 16400
  258. C                        !ALREADY AT BOTTOM?
  259.     CALL NEWSTA(TBASK,176,BSHAF,0,0)
  260. C                        !NO, LOWER BASKET.
  261.     CALL NEWSTA(FBASK,0,TSHAF,0,0)
  262.     CAGETF=.FALSE.
  263.     IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
  264. C                        !IF DARK, DIE.
  265.     RETURN
  266. C
  267. 16200    IF((PRSO.NE.FBASK).AND.(PRSI.NE.FBASK)) GO TO 16300
  268.     CALL RSPEAK(130)
  269. C                        !WRONG BASKET.
  270.     RETURN
  271. C
  272. 16300    IF(PRSA.NE.TAKEW) GO TO 10
  273. C                        !TAKE?
  274.     CALL RSPEAK(177)
  275. C                        !JOKE.
  276.     RETURN
  277. C
  278. 16400    CALL RSPEAK(125+RND(3))
  279. C                        !DUMMY.
  280.     RETURN
  281. C
  282. C O11--    GHOST FUNCTION
  283. C
  284. 17000    I=178
  285. C                        !ASSUME DIRECT.
  286.     IF(PRSO.NE.GHOST) I=179
  287. C                        !IF NOT, INDIRECT.
  288.     CALL RSPEAK(I)
  289.     RETURN
  290. C                        !SPEAK AND EXIT.
  291. C SOBJS, PAGE 7
  292. C
  293. C O12--    TUBE
  294. C
  295. 21000    IF((PRSA.NE.PUTW).OR.(PRSI.NE.TUBE)) GO TO 10
  296.     CALL RSPEAK(186)
  297. C                        !CANT PUT BACK IN.
  298.     RETURN
  299. C
  300. C O13--    CHALICE
  301. C
  302. 23000    IF((PRSA.NE.TAKEW).OR.(OCAN(PRSO).NE.0).OR.
  303. &        (OROOM(PRSO).NE.TREAS).OR.(OROOM(THIEF).NE.TREAS).OR.
  304. &        (and(OFLAG2(THIEF),FITEBT).EQ.0).OR.
  305. &        .NOT. THFACT) GO TO 10
  306.     CALL RSPEAK(204)
  307. C                        !CANT TAKE.
  308.     RETURN
  309. C
  310. C O14--    PAINTING
  311. C
  312. 24000    IF(PRSA.NE.MUNGW) GO TO 10
  313. C                        !MUNG?
  314.     CALL RSPEAK(205)
  315. C                        !DESTROY PAINTING.
  316.     OFVAL(PRSO)=0
  317.     OTVAL(PRSO)=0
  318.     ODESC1(PRSO)=207
  319.     ODESC2(PRSO)=206
  320.     RETURN
  321. C SOBJS, PAGE 8
  322. C
  323. C O15--    BOLT
  324. C
  325. 27000    IF(PRSA.NE.TURNW) GO TO 10
  326. C                        !TURN BOLT?
  327.     IF(PRSI.NE.WRENC) GO TO 27500
  328. C                        !WITH WRENCH?
  329.     IF(GATEF) GO TO 27100
  330. C                        !PROPER BUTTON PUSHED?
  331.     CALL RSPEAK(210)
  332. C                        !NO, LOSE.
  333.     RETURN
  334. C
  335. 27100    IF(LWTIDF) GO TO 27200
  336. C                        !LOW TIDE NOW?
  337.     LWTIDF=.TRUE.
  338. C                        !NO, EMPTY DAM.
  339.     CALL RSPEAK(211)
  340.     OFLAG2(COFFI)=and(OFLAG2(COFFI), not(SCRDBT))
  341.     OFLAG1(TRUNK)=or(OFLAG1(TRUNK),VISIBT)
  342.     RFLAG(RESER)=and(or(RFLAG(RESER),RLAND)
  343. &        ,not(RWATER+RSEEN))
  344.     RETURN
  345. C
  346. 27200    LWTIDF=.FALSE.
  347. C                        !YES, FILL DAM.
  348.     CALL RSPEAK(212)
  349.     IF(QHERE(TRUNK,RESER))
  350. &        OFLAG1(TRUNK)=and(OFLAG1(TRUNK), not(VISIBT))
  351.     RFLAG(RESER)=and(or(RFLAG(RESER),RWATER) ,not(RLAND))
  352.     RETURN
  353. C
  354. 27500    CALL RSPSUB(299,ODI2)
  355. C                        !NOT WITH THAT.
  356.     RETURN
  357. C
  358. C O16--    GRATING
  359. C
  360. 28000    IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  361.     IF(GRUNLF) GO TO 28200
  362. C                        !UNLOCKED?
  363.     CALL RSPEAK(214)
  364. C                        !NO, LOCKED.
  365.     RETURN
  366. C
  367. 28200    I=215
  368. C                        !UNLOCKED, VIEW FRM CLR.
  369.     IF(HERE.NE.CLEAR) I=216
  370. C                        !VIEW FROM BELOW.
  371.     SOBJS=OPNCLS(GRATE,I,885)
  372. C                        !OPEN/CLOSE.
  373.     RFLAG(MGRAT)=and(RFLAG(MGRAT), not(RLIGHT))
  374.     IF(QOPEN(GRATE)) RFLAG(MGRAT)=or(RFLAG(MGRAT),RLIGHT)
  375.     IF(.NOT.LIT(HERE)) CALL RSPEAK(406)
  376. C                        !IF DARK, DIE.
  377.     RETURN
  378. C
  379. C O17--    TRAP DOOR
  380. C
  381. 29000    IF(HERE.NE.LROOM) GO TO 29100
  382. C                        !FROM LIVING ROOM?
  383.     SOBJS=OPNCLS(DOOR,218,219)
  384. C                        !OPEN/CLOSE.
  385.     RETURN
  386. C
  387. 29100    IF(HERE.NE.CELLA) GO TO 10
  388. C                        !FROM CELLAR?
  389.     IF((PRSA.NE.OPENW).OR.QOPEN(DOOR)) GO TO 29200
  390.     CALL RSPEAK(220)
  391. C                        !CANT OPEN CLOSED DOOR.
  392.     RETURN
  393. C
  394. 29200    SOBJS=OPNCLS(DOOR,0,22)
  395. C                        !NORMAL OPEN/CLOSE.
  396.     RETURN
  397. C
  398. C O18--    DURABLE DOOR
  399. C
  400. 30000    I=0
  401. C                        !ASSUME NO APPL.
  402.     IF(PRSA.EQ.OPENW) I=221
  403. C                        !OPEN?
  404.     IF(PRSA.EQ.BURNW) I=222
  405. C                        !BURN?
  406.     IF(PRSA.EQ.MUNGW) I=223+RND(3)
  407. C                        !MUNG?
  408.     IF(I.EQ.0) GO TO 10
  409.     CALL RSPEAK(I)
  410.     RETURN
  411. C
  412. C O19--    MASTER SWITCH
  413. C
  414. 31000    IF(PRSA.NE.TURNW) GO TO 10
  415. C                        !TURN?
  416.     IF(PRSI.NE.SCREW) GO TO 31500
  417. C                        !WITH SCREWDRIVER?
  418.     IF(QOPEN(MACHI)) GO TO 31600
  419. C                        !LID UP?
  420.     CALL RSPEAK(226)
  421. C                        !NO, ACTIVATE.
  422.     IF(OCAN(COAL).NE.MACHI) GO TO 31400
  423. C                        !COAL INSIDE?
  424.     CALL NEWSTA(COAL,0,0,0,0)
  425. C                        !KILL COAL,
  426.     CALL NEWSTA(DIAMO,0,0,MACHI,0)
  427. C                        !REPLACE WITH DIAMOND.
  428.     RETURN
  429. C
  430. 31400    DO 31450 I=1,OLNT
  431. C                        !KILL NONCOAL OBJECTS.
  432.       IF(OCAN(I).NE.MACHI) GO TO 31450
  433. C                        !INSIDE MACHINE?
  434.       CALL NEWSTA(I,0,0,0,0)
  435. C                        !KILL OBJECT AND CONTENTS.
  436.       CALL NEWSTA(GUNK,0,0,MACHI,0)
  437. C                        !REDUCE TO GUNK.
  438. 31450    CONTINUE
  439.     RETURN
  440. C
  441. 31500    CALL RSPSUB(300,ODI2)
  442. C                        !CANT TURN WITH THAT.
  443.     RETURN
  444. C
  445. 31600    CALL RSPEAK(227)
  446. C                        !LID IS UP.
  447.     RETURN
  448. C SOBJS, PAGE 9
  449. C
  450. C O20--    LEAK
  451. C
  452. 33000    IF((PRSO.NE.LEAK).OR.(PRSA.NE.PLUGW).OR.(RVMNT.LE.0))
  453. &        GO TO 10
  454.     IF(PRSI.NE.PUTTY) GO TO 33100
  455. C                        !WITH PUTTY?
  456.     RVMNT=-1
  457. C                        !DISABLE LEAK.
  458.     CTICK(CEVMNT)=0
  459.     CALL RSPEAK(577)
  460.     RETURN
  461. C
  462. 33100    CALL RSPSUB(301,ODI2)
  463. C                        !CANT WITH THAT.
  464.     RETURN
  465. C
  466. C O21--    DROWNING BUTTONS
  467. C
  468. 34000    IF(PRSA.NE.PUSHW) GO TO 10
  469. C                        !PUSH?
  470.     GO TO (34100,34200,34300,34400),(PRSO-RBUTT+1)
  471.     GO TO 10
  472. C                        !NOT A BUTTON.
  473. C
  474. 34100    RFLAG(HERE)=xor(RFLAG(HERE),RLIGHT)
  475.     I=230
  476.     IF(and(RFLAG(HERE),RLIGHT).NE.0) I=231
  477.     CALL RSPEAK(I)
  478.     RETURN
  479. C
  480. 34200    GATEF=.TRUE.
  481. C                        !RELEASE GATE.
  482.     CALL RSPEAK(232)
  483.     RETURN
  484. C
  485. 34300    GATEF=.FALSE.
  486. C                        !INTERLOCK GATE.
  487.     CALL RSPEAK(232)
  488.     RETURN
  489. C
  490. 34400    IF(RVMNT.NE.0) GO TO 34500
  491. C                        !LEAK ALREADY STARTED?
  492.     CALL RSPEAK(233)
  493. C                        !NO, START LEAK.
  494.     RVMNT=1
  495.     CTICK(CEVMNT)=-1
  496.     RETURN
  497. C
  498. 34500    CALL RSPEAK(234)
  499. C                        !BUTTON JAMMED.
  500.     RETURN
  501. C
  502. C O22--    INFLATABLE BOAT
  503. C
  504. 36000    IF(PRSA.NE.INFLAW) GO TO 10
  505. C                        !INFLATE?
  506.     IF(OROOM(IBOAT).NE.0) GO TO 36100
  507. C                        !IN ROOM?
  508.     CALL RSPEAK(235)
  509. C                        !NO, JOKE.
  510.     RETURN
  511. C
  512. 36100    IF(PRSI.NE.PUMP) GO TO 36200
  513. C                        !WITH PUMP?
  514.     CALL NEWSTA(IBOAT,0,0,0,0)
  515. C                        !KILL DEFL BOAT,
  516.     CALL NEWSTA(RBOAT,236,HERE,0,0)
  517. C                        !REPL WITH INF.
  518.     DEFLAF=.FALSE.
  519.     RETURN
  520. C
  521. 36200    I=237
  522. C                        !JOKES.
  523.     IF(PRSI.NE.LUNGS) I=303
  524.     CALL RSPSUB(I,ODI2)
  525.     RETURN
  526. C
  527. C O23--    DEFLATED BOAT
  528. C
  529. 37000    IF(PRSA.NE.INFLAW) GO TO 37100
  530. C                        !INFLATE?
  531.     CALL RSPEAK(238)
  532. C                        !JOKE.
  533.     RETURN
  534. C
  535. 37100    IF(PRSA.NE.PLUGW) GO TO 10
  536. C                        !PLUG?
  537.     IF(PRSI.NE.PUTTY) GO TO 33100
  538. C                        !WITH PUTTY?
  539.     CALL NEWSTA(IBOAT,239,OROOM(DBOAT),OCAN(DBOAT),OADV(DBOAT))
  540.     CALL NEWSTA(DBOAT,0,0,0,0)
  541. C                        !KILL DEFL BOAT, REPL.
  542.     RETURN
  543. C SOBJS, PAGE 10
  544. C
  545. C O24--    RUBBER BOAT
  546. C
  547. 38000    IF(ARG.NE.0) GO TO 10
  548. C                        !DISMISS READIN, OUT.
  549.     IF((PRSA.NE.BOARDW).OR.(OADV(STICK).NE.WINNER)) GO TO 38100
  550.     CALL NEWSTA(RBOAT,0,0,0,0)
  551. C                        !KILL INFL BOAT,
  552.     CALL NEWSTA(DBOAT,240,HERE,0,0)
  553. C                        !REPL WITH DEAD.
  554.     DEFLAF=.TRUE.
  555.     RETURN
  556. C
  557. 38100    IF(PRSA.NE.INFLAW) GO TO 38200
  558. C                        !INFLATE?
  559.     CALL RSPEAK(367)
  560. C                        !YES, JOKE.
  561.     RETURN
  562. C
  563. 38200    IF(PRSA.NE.DEFLAW) GO TO 10
  564. C                        !DEFLATE?
  565.     IF(AV.EQ.RBOAT) GO TO 38300
  566. C                        !IN BOAT?
  567.     IF(OROOM(RBOAT).EQ.0) GO TO 38400
  568. C                        !ON GROUND?
  569.     CALL NEWSTA(RBOAT,0,0,0,0)
  570. C                        !KILL INFL BOAT,
  571.     CALL NEWSTA(IBOAT,241,HERE,0,0)
  572. C                        !REPL WITH DEFL.
  573.     DEFLAF=.TRUE.
  574.     RETURN
  575. C
  576. 38300    CALL RSPEAK(242)
  577. C                        !IN BOAT.
  578.     RETURN
  579. C
  580. 38400    CALL RSPEAK(243)
  581. C                        !NOT ON GROUND.
  582.     RETURN
  583. C
  584. C O25--    BRAIDED ROPE
  585. C
  586. 41000    IF((PRSA.NE.TIEW).OR.(PRSO.NE.BROPE).OR.
  587. &        ((PRSI.NE.HOOK1).AND.(PRSI.NE.HOOK2)))
  588. &        GO TO 41500
  589.     BTIEF=PRSI
  590. C                        !RECORD LOCATION.
  591.     CFLAG(CEVBAL)=.FALSE.
  592. C                        !STALL ASCENT.
  593.     CALL RSPEAK(248)
  594.     RETURN
  595. C
  596. 41500    IF((PRSA.NE.UNTIEW).OR.(PRSO.NE.BROPE)) GO TO 10
  597.     IF(BTIEF.NE.0) GO TO 41600
  598. C                        !TIED UP?
  599.     CALL RSPEAK(249)
  600. C                        !NO, JOKE.
  601.     RETURN
  602. C
  603. 41600    CALL RSPEAK(250)
  604.     BTIEF=0
  605. C                        !UNTIE.
  606.     CTICK(CEVBAL)=3
  607. C                        !RESTART CLOCK.
  608.     CFLAG(CEVBAL)=.TRUE.
  609.     RETURN
  610. C
  611. C O26--    SAFE
  612. C
  613. 42000    I=0
  614. C                        !ASSUME UNPROCESSED.
  615.     IF(PRSA.EQ.TAKEW) I=251
  616. C                        !TAKE?
  617.     IF((PRSA.EQ.OPENW).AND.SAFEF) I=253
  618. C                        !OPEN AFTER BLAST?
  619.     IF((PRSA.EQ.OPENW).AND..NOT.SAFEF) I=254
  620. C                        !OPEN BEFORE BLAST?
  621.     IF((PRSA.EQ.CLOSEW).AND.SAFEF) I=253
  622. C                        !CLOSE AFTER?
  623.     IF((PRSA.EQ.CLOSEW).AND..NOT.SAFEF) I=255
  624.     IF(I.EQ.0) GO TO 10
  625.     CALL RSPEAK(I)
  626.     RETURN
  627. C
  628. C O27--    FUSE
  629. C
  630. 43000    IF(PRSA.NE.BURNW) GO TO 10
  631. C                        !BURN?
  632.     CALL RSPEAK(256)
  633.     CTICK(CEVFUS)=2
  634. C                        !START COUNTDOWN.
  635.     RETURN
  636. C
  637. C O28--    GNOME
  638. C
  639. 44000    IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 44500
  640.     IF(OTVAL(PRSO).EQ.0) GO TO 44100
  641. C                        !TREASURE?
  642.     CALL RSPSUB(257,ODO2)
  643. C                        !YES, GET DOOR.
  644.     CALL NEWSTA(PRSO,0,0,0,0)
  645.     CALL NEWSTA(GNOME,0,0,0,0)
  646. C                        !VANISH GNOME.
  647.     GNODRF=.TRUE.
  648.     RETURN
  649. C
  650. 44100    CALL RSPSUB(258,ODO2)
  651. C                        !NO, LOSE OBJECT.
  652.     CALL NEWSTA(PRSO,0,0,0,0)
  653.     RETURN
  654. C
  655. 44500    CALL RSPEAK(259)
  656. C                        !NERVOUS GNOME.
  657.     IF(.NOT.GNOMEF) CTICK(CEVGNO)=5
  658. C                        !SCHEDULE BYEBYE.
  659.     GNOMEF=.TRUE.
  660.     RETURN
  661. C
  662. C O29--    COKE BOTTLES
  663. C
  664. 46000    IF((PRSA.NE.THROWW).AND.(PRSA.NE.MUNGW)) GO TO 10
  665.     CALL NEWSTA(PRSO,262,0,0,0)
  666. C                        !MUNG BOTTLES.
  667.     RETURN
  668. C SOBJS, PAGE 11
  669. C
  670. C
  671. C O30--    ROBOT
  672. C
  673. 53000    IF(PRSA.NE.GIVEW) GO TO 53200
  674. C                        !GIVE?
  675.     CALL NEWSTA(PRSO,0,0,0,AROBOT)
  676. C                        !PUT ON ROBOT.
  677.     CALL RSPSUB(302,ODO2)
  678.     RETURN
  679. C
  680. 53200    IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
  681.     CALL NEWSTA(ROBOT,285,0,0,0)
  682. C                        !KILL ROBOT.
  683.     RETURN
  684. C
  685. C O31--    GRUE
  686. C
  687. 56000    IF(PRSA.NE.EXAMIW) GO TO 56100
  688. C                        !EXAMINE?
  689.     CALL RSPEAK(288)
  690.     RETURN
  691. C
  692. 56100    IF(PRSA.NE.FINDW) GO TO 10
  693. C                        !FIND?
  694.     CALL RSPEAK(289)
  695.     RETURN
  696. C
  697.     END
  698.